from starlette.requests import Request

from app.core.handlers.permissions import APIWhitelist, IsAdmin, IsAuthorized


async def permission_inject(request: Request):
    # 白名单中的API可以任何人调用
    if await APIWhitelist().has_permission(request):
        return

    # TODO: 根据项目设置,如果项目admin拥有所有API权限可以设置,否则注释
    if await IsAdmin().has_permission(request):
        return

    # 没有登录
    if not await IsAuthorized().has_permission(request):
        await IsAuthorized().raise_exception()

    # TODO 检查用户是否被禁止访问 (API有允许,禁止两种权限,根据项目需要设置优先级)
    # 如果允许优先级较高,则如果同时存在允许和禁止权限,则允许调用,反之则禁止调用
    # 是为了适配角色权限和用户权限不一致的情况
